/**
 * 游戏控制和交互端到端测试
 * 测试键盘控制、触摸控制和游戏响应
 */
describe('游戏控制系统测试', () => {
  beforeEach(() => {
    cy.visit('/')
    cy.startNewGame()
    cy.selectCharacter('default')
  })

  describe('键盘控制测试', () => {
    it('应该响应跳跃控制', () => {
      // 执行跳跃
      cy.gameAction('jump')

      // 验证角色状态变化
      cy.window().its('gameStore').then((store) => {
        expect(store.player.isJumping).to.be.true
      })

      // 等待跳跃动画
      cy.wait(500)

      // 验证跳跃动画
      cy.get('[data-cy="player-sprite"]').should('have.class', 'jumping')
    })

    it('应该响应滑铲控制', () => {
      // 执行滑铲
      cy.gameAction('slide')

      // 验证角色状态
      cy.window().its('gameStore').then((store) => {
        expect(store.player.isSliding).to.be.true
      })

      // 验证滑铲动画
      cy.get('[data-cy="player-sprite"]').should('have.class', 'sliding')
    })

    it('应该响应左右移动控制', () => {
      // 向左移动
      cy.gameAction('left')
      cy.wait(200)

      // 验证位置变化
      cy.window().its('gameStore').then((store) => {
        const initialLane = store.player.currentLane
        expect(initialLane).to.be.lessThan(2) // 假设有3个车道 (0, 1, 2)
      })

      // 向右移动
      cy.gameAction('right')
      cy.wait(200)

      // 验证位置恢复
      cy.window().its('gameStore').then((store) => {
        expect(store.player.currentLane).to.equal(1) // 回到中间车道
      })
    })

    it('应该防止无效移动', () => {
      // 移动到最左边
      cy.gameAction('left')
      cy.wait(200)
      cy.gameAction('left')
      cy.wait(200)

      // 尝试继续向左移动（应该无效）
      cy.gameAction('left')
      cy.wait(200)

      // 验证仍在最左车道
      cy.window().its('gameStore').then((store) => {
        expect(store.player.currentLane).to.equal(0)
      })
    })

    it('应该支持组合操作', () => {
      // 跳跃 + 左移
      cy.get('body').type('{leftarrow} ')
      cy.wait(300)

      // 验证同时执行两个动作
      cy.window().its('gameStore').then((store) => {
        expect(store.player.isJumping).to.be.true
        expect(store.player.currentLane).to.equal(0)
      })
    })
  })

  describe('触摸控制测试', () => {
    beforeEach(() => {
      // 模拟移动设备
      cy.viewport('iphone-x')
    })

    it('应该显示触摸控制界面', () => {
      // 验证触摸控制按钮
      cy.get('[data-cy="touch-controls"]').should('be.visible')
      cy.get('[data-cy="jump-btn"]').should('be.visible')
      cy.get('[data-cy="slide-btn"]').should('be.visible')
      cy.get('[data-cy="left-btn"]').should('be.visible')
      cy.get('[data-cy="right-btn"]').should('be.visible')
    })

    it('应该响应触摸跳跃', () => {
      // 点击跳跃按钮
      cy.get('[data-cy="jump-btn"]').click()

      // 验证跳跃响应
      cy.get('[data-cy="player-sprite"]').should('have.class', 'jumping')
    })

    it('应该响应触摸滑铲', () => {
      // 点击滑铲按钮
      cy.get('[data-cy="slide-btn"]').click()

      // 验证滑铲响应
      cy.get('[data-cy="player-sprite"]').should('have.class', 'sliding')
    })

    it('应该响应滑动手势', () => {
      // 模拟向上滑动（跳跃）
      cy.get('[data-cy="game-canvas"]')
        .trigger('touchstart', { touches: [{ clientX: 640, clientY: 400 }] })
        .trigger('touchmove', { touches: [{ clientX: 640, clientY: 300 }] })
        .trigger('touchend')

      // 验证跳跃响应
      cy.get('[data-cy="player-sprite"]').should('have.class', 'jumping')

      cy.wait(1000)

      // 模拟向下滑动（滑铲）
      cy.get('[data-cy="game-canvas"]')
        .trigger('touchstart', { touches: [{ clientX: 640, clientY: 300 }] })
        .trigger('touchmove', { touches: [{ clientX: 640, clientY: 400 }] })
        .trigger('touchend')

      // 验证滑铲响应
      cy.get('[data-cy="player-sprite"]').should('have.class', 'sliding')
    })
  })

  describe('游戏响应性测试', () => {
    it('应该有合适的输入延迟', () => {
      const startTime = Date.now()

      // 执行跳跃
      cy.gameAction('jump')

      // 验证响应时间
      cy.get('[data-cy="player-sprite"]').should('have.class', 'jumping').then(() => {
        const responseTime = Date.now() - startTime
        expect(responseTime).to.be.lessThan(100) // 响应时间应小于100ms
      })
    })

    it('应该防止输入过于频繁', () => {
      // 快速连续跳跃
      cy.gameAction('jump')
      cy.gameAction('jump')
      cy.gameAction('jump')

      // 验证只有一次跳跃生效
      cy.window().its('gameStore').then((store) => {
        expect(store.player.jumpCount).to.equal(1)
      })
    })

    it('应该在游戏暂停时禁用控制', () => {
      // 暂停游戏
      cy.get('body').type('{esc}')
      cy.checkGameStatus('paused')

      // 尝试控制（应该无效）
      cy.gameAction('jump')

      // 验证控制无效
      cy.window().its('gameStore').then((store) => {
        expect(store.player.isJumping).to.be.false
      })
    })
  })

  describe('辅助功能测试', () => {
    it('应该支持键盘导航', () => {
      // 暂停游戏打开菜单
      cy.get('body').type('{esc}')

      // 使用Tab键导航
      cy.get('body').tab()
      cy.focused().should('have.attr', 'data-cy', 'resume-btn')

      cy.get('body').tab()
      cy.focused().should('have.attr', 'data-cy', 'settings-btn')

      cy.get('body').tab()
      cy.focused().should('have.attr', 'data-cy', 'menu-btn')
    })

    it('应该有适当的焦点指示器', () => {
      // 暂停游戏
      cy.get('body').type('{esc}')

      // 检查焦点样式
      cy.get('[data-cy="resume-btn"]').focus()
      cy.get('[data-cy="resume-btn"]').should('have.class', 'focused')
    })
  })
})